package basic_syntax;

import java.util.Scanner;


public class BasicGrammerDemo {
    public void basicGrammerExample() {

        // 基本数据类型，Java是强类型语言，变量需明确声明类型(JDK10以前)
        int age = 25;                 // 整数
        long n1=9000000000L;        //long型的结尾需要加L
        double price = 19.99;         // 浮点数，Java的浮点数完全遵循IEEE-754标准
        float f2 = 3.14e38f;        // 科学计数法表示的3.14x10^38
        char grade = 'A';             // 单个字符
        boolean isJavaFun = true;      // 布尔值，只有true和false两个值

        // 引用类型：字符串String（首字母大写），引用类型的变量类似于C语言的指针，它内部存储一个“地址”，指向某个对象在内存的位置
        String name = "Alice";

        // PI是一个常量，常量名通常全部大写
        final double PI = 3.14;


    }

    // 使用静态嵌套类便于在main方法中直接使用,不需要new对象
    public static void inputExample() {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入您的姓名: ");
        String name = scanner.nextLine();  // 读取一行输入

        System.out.print("请输入您的年龄: ");
        int age = scanner.nextInt();  // 读取整数输入

        System.out.println("您输入的信息如下：");
        System.out.println("姓名: " + name);
        System.out.println("年龄: " + age);

        scanner.close();  // 手动关闭扫描器

    }




    // 类与方法的层叠
    public void methodExample() {
        // 定义一个方法
        class Calculator {
            public int add(int a, int b) {
                return a + b;
            }

            public int subtract(int a, int b) {
                return a - b;
            }
        }

        // 使用方法
        Calculator calculator = new Calculator();
        System.out.println("Addition: " + calculator.add(10, 5));  // 输出：Addition: 15
        System.out.println("Subtraction: " + calculator.subtract(10, 5));  // 输出：Subtraction: 5
    }

    public void outputExample() {
        System.out.println("Java提供的输出包括：System.out.println() /print() /printf()，其中printf()可以格式化输出");
        System.out.println("hello world");

        //格式化输出
        double d = 3.1415926;
        System.out.printf("%.2f\n", d); // 显示两位小数3.14
        System.out.printf("%.4f\n", d); // 显示4位小数3.1416
        System.out.printf("当前时间是: %tT", System.currentTimeMillis());
    }

    public void calculateExample(){
        // 移位:左移实际上就是不断地×2，右移实际上就是不断地÷2
        // 对byte和short类型进行移位时，会首先转换为int再进行位移
        // 无符号的右移运算>>>，它的特点是不管符号位，右移后高位总是补0，对一个负数进行>>>右移，它会变成正数

        int n = -536870912; // 负数
        int a = n >>> 1;  // 11110000 00000000 00000000 00000000 = 1879048192 正数
        int b = n >>> 2;  // 00111000 00000000 00000000 00000000 = 939524096
        int double_b= b<<1;

        int c = n >>> 29; // 00000000 00000000 00000000 00000111 = 7

        System.out.println(a);
        System.out.println(b);
        System.out.println("double_b= "+double_b);
        System.out.println(c);


        //浮点数运算和整数运算相比，只能进行加减乘除这些数值计算，不能做位运算和移位运算
        //比较两个浮点数通常比较它们的差的绝对值是否小于一个特定值；

        double x = 1.0 / 10;
        double y = 1 - 9.0 / 10;

        double r = Math.abs(x - y);     //绝对值
        if (r < 0.00001) {
            System.out.println("可以认为相等");
        } else {
            System.out.println("可以认为不相等");
        }

        // 布尔运算是一种关系运算，包括以下几类：
        // 比较运算符：>，>=，<，<=，==，!=
        // 与运算 &&
        // 或运算 ||
        // 非运算 !
        // 布尔运算的一个重要特点是短路运算
        boolean result = true || (5 / 0 > 0); // 如果一个布尔运算的表达式能提前确定结果，后续计算也不再进行，而是直接返回true
        System.out.println(result);

    }

}
